﻿/*************************************************************************************
 * 工    具：  HK_FPSSystem
 * 
 * 描    述：  HK_FPSSystem 是一个 FPS（每秒帧数）监控系统，旨在帮助开发者实时监测和优化应用程序的性能。
              通过显示当前的 FPS 值，可以直观地了解应用在不同设备和场景下的运行表现。
              该系统提供了显示和隐藏 FPS 监控界面的方法，并允许设置应用程序的目标帧率，以实现性能优化和稳定性提升。
 * 
 * 版    本：  V1.0
 * 作    者：  京产肠饭
 * 
 * 创    建：  2025/1/2  V1.0
 *            
 * 链   接：   https://gitee.com/JingChanChangFan/hk_-unity-tools
*************************************************************************************/

using QFramework;
using UnityEngine;

namespace HKTools
{
    public interface IHK_FPSSystem : ISystem
    {
        /// <summary>
        /// 显示FPS监控
        /// </summary>
        void ShowFPSDisplay();
        /// <summary>
        /// 隐藏FPS监控
        /// </summary>
        void HideFPSDisplay();
        /// <summary>
        /// 设置应用程序的目标帧率
        /// </summary>
        void SetTargetFrameRate(int targetFrameRate);
    }

    public class HK_FPSSystem : AbstractSystem, IHK_FPSSystem
    {
        bool isShowFPS = false;

        int frameCount = 0;
        float elapsedTime = 0.0f;
        float fps = 0.0f;
        float updateInterval = 0.5f; // 更新间隔（秒）

        string fpsText;

        GUIStyle fpsStyle;

        protected override void OnInit()
        {
            // 初始化 GUI 样式  
            fpsStyle = new GUIStyle
            {
                normal = { textColor = Color.white },
                fontSize = (int)(15 * ((float)Screen.width / 1280)),
                alignment = TextAnchor.UpperLeft
            };
        }

        /// <summary>
        /// 显示FPS监控
        /// </summary>
        public void ShowFPSDisplay()
        {
            if (isShowFPS)
                return;

            frameCount = 0;
            elapsedTime = 0.0f;

            ActionKit.OnUpdate.Register(CalculateFPS);
            ActionKit.OnGUI.Register(DisplayFPS);

            isShowFPS = true;
        }

        /// <summary>
        /// 隐藏FPS监控
        /// </summary>
        public void HideFPSDisplay()
        {
            if (!isShowFPS)
                return;

            frameCount = 0;
            elapsedTime = 0.0f;

            ActionKit.OnUpdate.UnRegister(CalculateFPS);
            ActionKit.OnGUI.UnRegister(DisplayFPS);

            isShowFPS = false;
        }

        // 计算当前时间段的FPS
        void CalculateFPS()
        {
            frameCount++;
            elapsedTime += Time.unscaledDeltaTime;

            if (elapsedTime > updateInterval)
            {
                fps = frameCount / elapsedTime;
                frameCount = 0;
                elapsedTime = 0.0f;
            }
        }

        // 在OnGUI中显示FPS
        void DisplayFPS()
        {
            if (fps != 0.0f)
            {
                fpsText = "FPS：" + Mathf.Ceil(fps).ToString();
            }
            else
            {
                fpsText = "FPS：";
            }

            GUI.Label(new Rect(10, 10, 100, 30), fpsText, fpsStyle);
        }

        /// <summary>
        /// 设置应用程序的目标帧率
        /// </summary>
        public void SetTargetFrameRate(int targetFrameRate)
        {
            if (targetFrameRate > 0)
            {
                Application.targetFrameRate = targetFrameRate;
            }
            else if (targetFrameRate == -1)
            {
                Application.targetFrameRate = -1;
            }
            else
            {
                HKDebug.LogError("目标刷新率必须大于0！");
            }
        }
    }
}